Amazon Kinesis Data Firehoseの動的パーティショニング(jqパーサー)を試してみた
AWSチームのすずきです。
Amazon Kinesis Data Firehose、動的パーティショニング をサポートするアップデートがありました。
今回、動的パーティショニングを有効にした Firehose 配信ストリームを AWS WAFのアクセスログ の出力先に設定。 jqパーサーを利用したブロック(BLOCK)判定ログの分類を試みる機会がありましたので、紹介させていただきます。
Amazon Kinesis Data Firehose の動的パーティショニングのご紹介
Firehose 設定
Kinesis Data Firehose 配信ストリームの新規作成時、 動的パーティショニング (Dynamic partitioning)の設定が可能になりました。
JSON処理
jqパーサーを用いたインライン解析を行う指定としました。
キー設定
「action」と「httpSourceId」をパーティションキーとする設定を行いました。
Key name | JQ expression |
---|---|
action | .action |
httpSourceId | .httpSourceId |
サンプル
以下のAWS WAF、BLOCKログが、分類できる事を確認しました。
{ "timestamp": 1630926211307, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-northeast-1:0000:regional/webacl/000-000-webacl/0000-0000-0000", "terminatingRuleId": "000-wafv2-UserAgent-BlackList", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [], "httpSourceName": "ALB", "httpSourceId": "0000-app/000-000-000/0000", "ruleGroupList": [ { "ruleGroupId": "arn:aws:wafv2:ap-northeast-1:0000:regional/rulegroup/000-wafv2-WhiteListRuleGroup/00-00-00-00-00", "terminatingRule": null, "nonTerminatingMatchingRules": [], "excludedRules": null } ], "httpRequest": { "clientIp": "0.0.0.0", "country": "US", "headers": [ { "name": "User-Agent", "value": "Mozilla/5.0 zgrab/0.x" } ], "uri": "/UPnP/IGD.xml", "httpVersion": "HTTP/1.1", "httpMethod": "GET" } }
S3設定設定
Firehose 出力先 S3の S3 bucket prefix のカスタマイズを実施しました。
jqパーサーで得られた2つのパーティションキー(action
、httpSourceId
)をS3のキーに含める設定としました。
waflog-dp/!{partitionKeyFromQuery:httpSourceId}/action=!{partitionKeyFromQuery:action}/!{timestamp:'year='yyyy'/month='MM'/day='dd'/hour='HH}/
実行例
ALB名(httpSourceId)直下のキー階層で、「action=BLOCK」と「action=ALLOW」の分類が実現できました。
ブロックされたアクセスログのみが「action=BLOCK」以下で確認可能になりました。
S3オブジェクトのキーサンプル
s3://<S3バケット名>/waflog-dp/<httpSourceId>/action=BLOCK/year=2021/month=09/day=06/hour=11/<Firehose名>-2021-09-06-11-03-31-###.gz
料金
東京リージョンで S3の動的パーティショニングを利用すると、以下の料金が追加で発生します。
説明 | 金額 |
---|---|
Per GB delivered | $0.032 |
Per 1,000 objects delivered | $0.008 |
JQ processing, per hour (optional) | $0.112 |
まとめ
従来、ログレコードに含まれれるデータをS3のパーティションとして反映するためには、Lambda、Glueなどでコード実装が必要でしたが、 jqパーサーで処理できるJSONデータであれば、ノーコードで利用可能になりました。
動的パーティショニングを利用する事で Athena などを利用した分析の効率化が期待できる場合には、ぜひご活用ください。
- Lambda利用例
尚、Block ログのみを必要とする場合、AWS WAF標準でサポートされているフィルタリングをお試しください。